package com.shujia.spark.mllib

import org.apache.spark.ml.classification.{NaiveBayes, NaiveBayesModel}
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

object Demo6Person {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession
      .builder()
      .master("local[8]")
      .appName("image")
      .getOrCreate()
    import spark.implicits._

    //1、读取数据
    val personDF: DataFrame = spark.read
      .format("libsvm")
      .load("data/人体指标.txt")

    //2、将数据切分成训练集和测试集
    val Array(train, test) = personDF.randomSplit(Array(0.8, 0.2))

    //3、选择算法训练模型
    val naiveBayes = new NaiveBayes()

    //将训练集带入算法训练模型
    val model: NaiveBayesModel = naiveBayes.fit(train)

    //将测试集带入模型测试模型的准确率
    val testDF: DataFrame = model.transform(test)

    testDF.show()

    //6、计算准确率
    val p: Double = testDF.where($"label" === $"prediction").count().toDouble / testDF.count() * 100
    println(s"准确率：$p")

    //7、计算召回率:TP / TP+FN
    //TP（True Positives)：真正例，预测为正例而且实际上也是正例；
    //FP（False Positives)：假正例，预测为正例然而实际上却是负例；
    //FN（false Negatives)：假负例，预测为负例然而实际上却是正例；
    //TN（True Negatives)：真负例，预测为负例而且实际上也是负例。
    val r: Double = testDF.where($"label" === 1 and $"prediction" === 1).count().toDouble / testDF.where($"label" === 1).count()
    println(s"召回率：$r")
  }
}